File manager - Edit - /home/autoph/public_html/projects/app/Http/Controllers/API/v1/EmployeeAttendanceController.php
Back
<?php namespace App\Http\Controllers\API\v1; use App\Http\Controllers\Controller; use App\Models\Approver; use App\Models\Employee; use App\Models\EmployeeChangeSchedule; use App\Models\EmployeeLeave; use App\Models\EmployeeOb; use App\Models\EmployeeOffset; use App\Models\EmployeeOvertime; use App\Models\EmployeeSchedule; use App\Models\EmployeeWfh; use App\Models\EmployeeTimeAdjustment; use App\Models\Holiday; use App\Models\Timelog; use App\Models\WfhFloatedTimelog; use App\Models\ProcessedTimelog; use App\Models\ProcessedAbsent; use App\Models\ProcessedLeave; use App\Models\ProcessedTardiness; use App\Models\ProcessedUndertime; use App\Models\ProcessedOvertime; use App\Models\ProcessedNightDifferential; use App\Models\ProcessedHolidayRestdayDuty; use App\Models\ProcessedDailyWorkHours; use App\Models\ProcessedSchedule; use App\Models\ProcessedOb; use App\Models\PremiumOvertimePaySetting; use App\Models\WorkSuspension; use Carbon\Carbon; use App\Models\PayrollSetting; use App\Models\ProcessedOffsetAvailment; use App\Models\TimelogEdit; use App\Models\SalaryAndWages; use DateInterval; use DatePeriod; use DateTime; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Throwable; use Carbon\CarbonPeriod; class EmployeeAttendanceController extends Controller { public function index(Request $request) { $user = Auth::user(); // dd($user['employee_id']); // dd($user->employees); $start_date = new DateTime($request->start_date); $end_date = new DateTime($request->end_date); $end_date->modify('+1 day'); // Include the end date in the range //Check if employee is always present $isAlwaysPresent = $this->alwaysPresent($user->employee_id); // Create a DatePeriod object $period = new DatePeriod($start_date, new DateInterval('P1D'), $end_date); $presentDays = 0; $data = []; foreach ($period as $date) { $formattedDate = $date->format('Y-m-d'); // Get Timelogs $timelogs = $this->getTimelog($formattedDate, $user->employees->time_keeping_id); $this->addTimelogData($data, $timelogs, $formattedDate); // Get Time Adjustment $timeAdjustment = $this->getTimeAdjustments($formattedDate, $user->employee_id); $this->addTimeAdjustmentData($data, $timeAdjustment, $formattedDate); // Get Schedule $schedule = $this->getSchedule($formattedDate, $user->employee_id); if(!$isAlwaysPresent){ $this->addScheduleData($data, $schedule, $formattedDate, $user->employee_id); } // Get Holiday $holiday = $this->getHoliday($formattedDate, $user->employees, $schedule); $this->addHolidayData($data, $holiday, $formattedDate); // Get Work Suspension $workSuspension = $this->getWorkSuspension($formattedDate); $this->addWorkSuspensionData($data, $workSuspension, $formattedDate); // GET WFH $wfhRecord = EmployeeWfh::whereNotNull('attachment')->where(['employee_id'=> $user->employee_id, 'date'=>$formattedDate, 'status'=>2, 'validated'=>1])->first(); $this->addWfhData($data, $wfhRecord, $formattedDate); // Get Leave $leave = $this->getLeave($formattedDate, $user->employee_id); if(!$holiday){ $this->addLeaveData($data, $leave, $formattedDate); } //get OB $ob = $this->getOB($formattedDate, $user->employee_id); $this->addOBData($data, $ob, $formattedDate); //get Offset Availment $offsetAvailment = $this->getOffsetAvailment($formattedDate, $user->employee_id); $this->addOffsetAvailmentData($data, $offsetAvailment, $formattedDate); // Get Overtime $overtime = $this->getOvertime($formattedDate, $user->employee_id); $this->addOvertimeData($data, $overtime, $formattedDate); if(!$isAlwaysPresent){ // Check Tardiness $halfDayLeave = $leave && $leave->half_day == 1; $tardiness = $this->getTardiness($timelogs, $schedule, $halfDayLeave, $ob, $offsetAvailment, $user->employees->classification_id); $this->addTardinessData($data, $tardiness, $formattedDate); // Get Undertime $undertime = $this->getUndertime($timelogs, $schedule, $workSuspension, $formattedDate, $ob, $offsetAvailment, $wfhRecord, $halfDayLeave); $this->addUndertimeData($data, $undertime, $formattedDate); if(!$ob && !$offsetAvailment){ $this->addAbsenceData($data, $timelogs, $leave, $holiday, $schedule, $formattedDate); } } // Check if present if ($this->isPresent($timelogs, $leave, $holiday, $schedule, $formattedDate)) { $presentDays++; } } // dd($presentDays); return response()->json($data); } public function getDailyAttedance() { $user = Auth::user(); $day = date('d'); $start_date = ''; $end_date = ''; // dd($day); if($day >= 6 && $day <= 20){ $start_date = new DateTime(date('Y-m-6')); $end_date = new DateTime(date('Y-m-20')); } else if ($day >= 21 && $day >= 5){ $start_date = new DateTime(date('Y-m-21')); $end_date = new DateTime(date('Y-m-5')); $end_date->modify('+1 month'); } // Create a DatePeriod object $period = new DatePeriod($start_date, new DateInterval('P1D'), $end_date); $presentDays = 0; $data = []; foreach ($period as $date) { $formattedDate = $date->format('Y-m-d'); // Get Timelogs $timelogs = $this->getTimelog($formattedDate, $user->employee_id); $this->addTimelogData($data, $timelogs, $formattedDate); } // dd($data); return response()->json($data); } public function addTimelogData(&$data, $timelogs, $date) { if ($timelogs) { foreach ($timelogs as $timelog) { $data['timelog'][] = [ 'title' => $timelog->in_out ? ($timelog->in_out == "I" ? date('H:ia', strtotime($timelog->datetimelog)) . " In" : date('H:ia', strtotime($timelog->datetimelog)) . " Out") : "", 'date' => $date, 'className' => (!empty($timelog->adjustment) ? "bg-time-adjustment text-white" : ($timelog->in_out ? ($timelog->in_out == "I" ? 'bg-time-in text-white' : 'bg-time-out text-white') : "")) ]; } } } public function addScheduleData(&$data, $schedule, $date, $employee_id) { $dayoff = EmployeeChangeSchedule::where('dayoff_date', $date)->where('status', 2)->where('validated', 1)->first(); $employee_change_schedule = EmployeeChangeSchedule::where(fn($q) => $q->whereNull('date_to') ->where('date', $date) ->orWhere(fn($q) => $q->whereNotNull('date_to') ->where('date', '<=', $date) ->where('date_to', '>=', $date) ) ->where('status', 2) ->where('validated', 1) )->where('status', 2) ->where('validated', 1) ->where('employee_id', $employee_id)->first(); if(!empty($dayoff)){ $data['schedule'][] = [ 'id' => $date, 'date' => $date, 'title' => "Day Off", 'className' => 'bg-dayoff text-white', ]; } else if(!empty($employee_change_schedule)){ $data['schedule'][] = [ 'id' => $date, 'date' => $date, 'title' => date('H:i', strtotime($employee_change_schedule->from_time)) . '-' . date('H:i', strtotime($employee_change_schedule->to_time)), 'className' => 'bg-schedule text-white', ]; } if ($schedule && empty($dayoff) && empty($employee_change_schedule)) { $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); $daysShiftingArray = explode(',', $schedule->schedule->shifting_day); $daysWFHArray = explode(',', $schedule->schedule->wfh); $daysCWSArray = explode(',', $schedule->schedule->cws_day); $data['schedule'][] = [ 'id' => $date, 'date' => $date, 'title' => in_array($dayOfWeek, $daysArray) ? "Day Off" : ( in_array($dayOfWeek, $daysWFHArray) ? date('H:i', strtotime($schedule->schedule->from_time)) . '-' . date('H:i', strtotime($schedule->schedule->to_time)) . ' (WFH)' : ( in_array($dayOfWeek, $daysCWSArray) ? date('H:i', strtotime($schedule->schedule->cws_from_time)) . '-' . date('H:i', strtotime($schedule->schedule->cws_to_time)) : ( in_array($dayOfWeek, $daysShiftingArray) ? date('H:i', strtotime($schedule->schedule->shifting_from_time)) . '-' . date('H:i', strtotime($schedule->schedule->shifting_to_time)) : date('H:i', strtotime($schedule->schedule->from_time)) . '-' . date('H:i', strtotime($schedule->schedule->to_time)) ) ) ), 'start' => $date, 'className' => in_array($dayOfWeek, $daysArray) ? 'bg-dayoff text-white' : 'bg-schedule text-white', ]; } } public function addTimeAdjustmentData(&$data, $timeAdjustments, $date) { if ($timeAdjustments->isNotEmpty()) { foreach($timeAdjustments as $timeAdjustment){ $inOrOut = ''; if($timeAdjustment->in_out == 0){ $inOrOut = " In"; } else { $inOrOut = " Out"; } $data['timeAdjustment'][] = [ 'title' => date('H:ia', strtotime($timeAdjustment->time)).$inOrOut, 'date' => $date, 'className' => 'bg-time-adjustment text-white', ]; } // dd($timeAdjustment[0]); // $data['timeAdjustment'][] = [ // 'title' => $timeAdjustment->time .' '. $timeAdjustment->in_out == 1 ? "IN" : "OUT", // 'date' => $date, // 'className' => 'bg-time-adjustment text-white', // ]; } } public function addHolidayData(&$data, $holiday, $date) { if ($holiday) { $data['holiday'][] = [ 'title' => $holiday->name, 'from_date' => $holiday->from_date, 'to_date' => $holiday->to_date, 'date' => $date, 'recurring' => $holiday->recurring, 'className' => 'bg-holiday text-white', ]; } } public function addWorkSuspensionData(&$data, $workSuspension, $date) { if ($workSuspension) { $data['workSuspension'][] = [ 'title' => $workSuspension->reason, 'from_date' => $workSuspension->date, 'to_date' => $workSuspension->date, 'date' => $date, 'className' => 'bg-suspension text-white', ]; } } public function addLeaveData(&$data, $leave, $date) { if ($leave) { $halfday = ''; $without_pay = ''; if($leave->half_day == 1){ $halfday = ' (Half Day)'; } if($leave->without_pay == 1){ $without_pay = ' (Absent)'; } $data['leave'][] = [ 'title' => $leave->leave_type->name.$halfday.$without_pay, 'from_date' => $leave->from_date, 'to_date' => $leave->to_date, 'date' => $date, 'className' => 'bg-leave text-white', ]; // dd($data); } } public function addTardinessData(&$data, $tardiness, $date) { if ($tardiness) { $data['tardiness'][] = [ 'title' => $tardiness.' minutes', 'date' => $date, 'className' => 'bg-tardiness text-white', ]; } } public function addOvertimeData(&$data, $overtime, $date) { if ($overtime) { $data['overtime'][] = [ 'id' => $date, 'date' => $date, 'title' => date('H:i', strtotime($overtime->from_time)) . '-' . date('H:i', strtotime($overtime->to_time)), 'start' => $date, 'className' => 'bg-overtime text-white', ]; } } public function addWfhData(&$data, $wfhRecord, $date) { if ($wfhRecord) { // dd($ob); $data['wfhRecord'][] = [ 'title' => $wfhRecord->hours.' HOURS (WFH)', 'date' => $date, 'className' => 'bg-wfh text-white', ]; } } public function addOBData(&$data, $ob, $date) { if ($ob) { // dd($ob); $data['ob'][] = [ 'title' => date('H:i A', strtotime($ob->from_time)).' - '.date('H:i A', strtotime($ob->to_time)), 'date' => $date, 'className' => 'bg-ob text-white', ]; } } public function addOffsetAvailmentData(&$data, $offsetAvailment, $date) { if ($offsetAvailment) { // dd($ob); $data['offsetAvailment'][] = [ 'title' => date('H:i A', strtotime($offsetAvailment->from_time)).' - '.date('H:i A', strtotime($offsetAvailment->to_time)), 'date' => $date, 'className' => 'bg-offset-availment text-white', ]; } } public function addUndertimeData(&$data, $undertime, $date) { if ($undertime) { $data['undertime'][] = [ 'title' => $undertime.' minutes', 'date' => $date, 'className' => 'bg-undertime text-white', ]; } } private function alwaysPresent($employee_id){ $isAlwaysPresent = false; $data = SalaryAndWages::where('employee_id',$employee_id)->first(); if($data->always_present ==1){ $isAlwaysPresent = true; } return $isAlwaysPresent; } public function addAbsenceData(&$data, $timelogs, $leave, $holiday, $schedule, $date) { $dayoff = EmployeeChangeSchedule::where('dayoff_date', $date)->where('status', 2)->where('validated', 1)->first(); // if($holiday){ // dd($holiday); // } if($holiday && $holiday['isAbsentBeforeHoliday'] == true){ $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); // Convert string to array if (!in_array($dayOfWeek, $daysArray) && new DateTime($date) < new DateTime()) { $data['absent'][] = [ 'title' => "Absent", 'date' => $date, 'className' => 'bg-absent text-white', ]; } } if (!$timelogs->count() && !$leave && !$holiday && $schedule && empty($dayoff)) { $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); // Convert string to array if (!in_array($dayOfWeek, $daysArray) && new DateTime($date) < new DateTime()) { $data['absent'][] = [ 'title' => "Absent", 'date' => $date, 'className' => 'bg-absent text-white', ]; } } } public function getSchedule($date, $employee_id) { $dayOfWeek = Carbon::parse($date)->format('l'); $employeeSchedule = EmployeeSchedule::with('schedule') ->where('date_from', '<=', $date) ->where('date_to', '>=', $date) ->where('effectivity_date', '<=', $date) ->where('employee_id', '=', $employee_id) ->whereHas('schedule') ->first(); if($employeeSchedule == null){ $employeeSchedule = EmployeeSchedule::with('schedule') ->where('effectivity_date', '<=', $date) ->where('employee_id', '=', $employee_id) ->orderBy('effectivity_date', 'desc') ->whereHas('schedule') ->first(); } // if($date == '2024-12-21'){ $employee_change_schedule = EmployeeChangeSchedule::where(fn($q) => $q->whereNull('date_to') ->where('date', $date) ->orWhere(fn($q) => $q->whereNotNull('date_to') ->where('date', '<=', $date) ->where('date_to', '>=', $date) ) ->where('status', 2) ->where('validated', 1) )->where('status', 2) ->where('validated', 1) ->where('employee_id', $employee_id)->first(); // dd($employee_change_schedule['from_time']); if (!empty($employeeSchedule) && isset($employeeSchedule->schedule['shifting_day'])) { if ($dayOfWeek == $employeeSchedule->schedule['shifting_day']) { $employeeSchedule->schedule['from_time'] = $employeeSchedule->schedule['shifting_from_time']; $employeeSchedule->schedule['to_time'] = $employeeSchedule->schedule['shifting_to_time']; } } if(!empty($employee_change_schedule)){ $employeeSchedule->schedule['from_time'] = $employee_change_schedule['from_time']; $employeeSchedule->schedule['to_time'] = $employee_change_schedule['to_time']; } return $employeeSchedule; // return EmployeeSchedule::with('schedule') // ->where('date_from', '<=', $date) // ->where('date_to', '>=', $date) // ->where('effectivity_date', '<=', $date) // ->where('employee_id', '=', $employee_id) // ->first(); } public function getHoliday($date, $employee, $schedule) { $data = Holiday::where(fn($query) => $query->where('from_date', '<=', $date) ->where('to_date', '>=', $date) ->where('enabled', 1) ) ->orWhere(fn($query) => $query->where('recurring', 1) // Assuming a `recurring` column ->where(DB::raw('DATE_FORMAT(from_date, "%m-%d")'), '=', Carbon::parse($date)->format('m-d')) ->where('enabled', 1) ) ->first(); if($data && $data->holiday_type==3) { if(empty($employee->work_location_id) || $employee->work_location_id != $data->locality) { $data = null; } } if($schedule && $data){ $daysArray = explode(',', $schedule->schedule->day_off); // Convert string to array $date = $date; // Example starting date // dd($daysArray); do { $date = date('Y-m-d', strtotime($date . ' -1 day')); $dayOfWeek = date('l', strtotime($date)); // Get the day of the week $checkIfPreviousDateIsHoliday = Holiday::where(fn($query) => $query->where('from_date', '<=', $date) ->where('to_date', '>=', $date) ->where('enabled', 1) ) ->orWhere(fn($query) => $query->where('recurring', 1) // Assuming a `recurring` column ->where(DB::raw('DATE_FORMAT(from_date, "%m-%d")'), '=', Carbon::parse($date)->format('m-d')) ->where('enabled', 1) ) ->first(); } while (in_array($dayOfWeek, $daysArray) || $checkIfPreviousDateIsHoliday); // Continue if it's in $daysArray $newDate = $date; $leave = $this->getLeave($newDate, $employee->employee_id); $timelogs = $this->getTimelog($newDate, $employee->time_keeping_id); $ob = $this->getOB($newDate, $employee->employee_id); $offsetAvailment = $this->getOffsetAvailment($newDate, $employee->employee_id); $dayoff = EmployeeChangeSchedule::where('dayoff_date', $newDate)->where('status', 2)->where('validated', 1)->first(); if ($data && !$timelogs->count() && !$leave && $schedule && empty($dayoff) && !$ob && !$offsetAvailment) { $data['isAbsentBeforeHoliday'] = true; } else if($data && $leave && ($leave['without_pay'] == 1)) { $data['isAbsentBeforeHoliday'] = true; } } return $data; } public function getWorkSuspension($date) { return WorkSuspension::where('date', '<=', $date) ->where('date', '>=', $date) ->where('enabled', '=', 1) ->first(); } public function getLeave($date, $employee_id) { return EmployeeLeave::with('leave_type') ->where('employee_id', '=', $employee_id) ->where('date_from', '<=', $date) ->where('date_to', '>=', $date) ->where('enabled', '=', 1) ->where('status', '=', 2) ->first(); } // public function getTimelog($date, $employee_id) // { // return Timelog::select('employee_id', DB::raw("MIN(datetimelog) AS datetimelog"), 'time_keeping_id', 'in_out')->whereDate('datetimelog', $date) // ->where(fn($query) => $query->where('employee_id', $employee_id) // ->orWhere('time_keeping_id', $employee_id)) // ->groupBy('employee_id', DB::raw("DATE(datetimelog)"), 'time_keeping_id', 'in_out') // ->get(); // } public function getTimelog($date, $employee_id) { // Get the primary timelog records for the specified date and employee $timelog = $this->getPrimaryTimelog($date, $employee_id); // Get any applicable time adjustments $timeAdjustments = $this->getTimeAdjustments($date, $employee_id); // if($date == '2024-12-28'){ // dd($timelog); // } if ($timeAdjustments->isNotEmpty()) { // Get the time adjustments for IN and OUT $time_in = $this->getTimeAdjustmentByType($timeAdjustments, 0); $time_out = $this->getTimeAdjustmentByType($timeAdjustments, 1); // Create a map of the existing timelogs by in_out type for quick lookup $timelogMap = $timelog->keyBy('in_out'); // If there's a time adjustment for IN, update or add the IN timelog if ($time_in) { $timelogMap['I'] = (object)[ 'employee_id' => $employee_id, 'datetimelog' => $time_in, 'time_keeping_id' => $employee_id, // Assuming time_keeping_id is the same as employee_id 'in_out' => 'I', 'adjustment' => true, ]; } // If there's a time adjustment for OUT, update or add the OUT timelog if ($time_out) { $timelogMap['O'] = (object)[ 'employee_id' => $employee_id, 'datetimelog' => $time_out, 'time_keeping_id' => $employee_id, // Assuming time_keeping_id is the same as employee_id 'in_out' => 'O', 'adjustment' => true, ]; } // Convert the map back to a collection $timelog = collect($timelogMap->values()); } // Get any applicable time adjustments // DB::enableQueryLog(); $alteredTimelog = $this->getTimelogEdits($date, $employee_id); if ($alteredTimelog->isNotEmpty()) { $time_in = $this->getTimelogEditByType($alteredTimelog, "I"); $time_out = $this->getTimelogEditByType($alteredTimelog, "O"); $latestOut = $alteredTimelog->where('in_out', 'O')->sortByDesc('datetimelog')->first(); // Remove existing "O" entries $timelog = $timelog->reject(fn($t) => $t->in_out === "O")->values(); $alteredTimelog->each(function ($log) use ($timelog, $time_in, $time_out, $latestOut) { $logData = (object)[ 'employee_id' => $log->employee_id, 'datetimelog' => $this->getAlteredTime($log, $time_in, $time_out), 'time_keeping_id' => $log->time_keeping_id, 'in_out' => $log->in_out, ]; if ($log->in_out === "O") { // Only push the latest "O" entry if ($log->datetimelog === $latestOut->datetimelog) { $timelog->push($logData); } } else { // Push all other entries normally $timelog->push($logData); } }); } // if($date == '2024-12-28'){ // dd($timelog); // } return $timelog; } // Helper to retrieve primary timelog entries private function getPrimaryTimelog($date, $employee_id) { // return Timelog::select('employee_id', 'time_keeping_id', 'in_out', DB::raw("CASE WHEN in_out = 'I' THEN MIN(datetimelog) ELSE MAX(datetimelog) END AS datetimelog")) // ->whereDate('datetimelog', $date) // ->where(fn($query) => $query->where('employee_id', $employee_id) // ->orWhere('time_keeping_id', $employee_id)) // ->groupBy('employee_id', 'time_keeping_id', 'in_out') // ->get(); $data = []; $payrollSetting = PayrollSetting::first(); $nextDayLastTimeout = $payrollSetting->next_day_last_timeout ?? '00:00:00'; $nextDay = Carbon::parse($date)->addDay()->format('Y-m-d'); $timelogIn = Timelog::select('employee_id', 'time_keeping_id', 'in_out', DB::raw("MIN(datetimelog)AS datetimelog")) ->whereDate('datetimelog', $date) ->where('in_out', 'I') ->where(fn($query) => $query->where('employee_id', $employee_id) ->orWhere('time_keeping_id', $employee_id)) ->groupBy('employee_id', 'time_keeping_id', 'in_out') ->first(); if($timelogIn) { $timeIn = $timelogIn->datetimelog; $timeIn = Carbon::parse($timelogIn->datetimelog)->addMinutes(2)->format('Y-m-d H:i:s'); // if($employee_id=='2644' && $date=='2024-12-23') { DB:: flushQueryLog(); DB::enableQueryLog(); } $timelogOut = Timelog::select('employee_id', 'time_keeping_id', 'in_out', DB::raw("MIN(datetimelog)AS datetimelog")) ->whereDate('datetimelog', $date) ->where('datetimelog', '>', $timeIn) ->where('in_out', 'O') ->where(fn($query) => $query->where('employee_id', $employee_id) ->orWhere('time_keeping_id', $employee_id)) ->groupBy('employee_id', 'time_keeping_id', 'in_out') ->first(); // if($employee_id=='2644' && $date=='2024-12-23') dd(DB::getQueryLog()); } else { $timelogOut = Timelog::select('employee_id', 'time_keeping_id', 'in_out', DB::raw("MIN(datetimelog)AS datetimelog")) ->whereDate('datetimelog', $date) ->where('datetimelog', '>', $date.' '.$nextDayLastTimeout) ->where('in_out', 'O') ->where(fn($query) => $query->where('employee_id', $employee_id) ->orWhere('time_keeping_id', $employee_id)) ->groupBy('employee_id', 'time_keeping_id', 'in_out') ->first(); } if(!$timelogOut) { $timelogOut = Timelog::select('employee_id', 'time_keeping_id', 'in_out', DB::raw("MIN(datetimelog)AS datetimelog")) ->whereDate('datetimelog', $nextDay) ->where('datetimelog', '<', $nextDay.' '.$nextDayLastTimeout) ->where('in_out', 'O') ->where(fn($query) => $query->where('employee_id', $employee_id) ->orWhere('time_keeping_id', $employee_id)) ->groupBy('employee_id', 'time_keeping_id', 'in_out') ->first(); } // if($employee_id=='2644' && $date=='2024-12-23') { // $data = collect([])->when($timelogIn, fn($collection) => $collection->merge([$timelogIn])) // ->when($timelogOut, fn($collection) => $collection->merge([$timelogOut])); // dd($data->toArray()); // } return collect([])->when($timelogIn, fn($collection) => $collection->merge([$timelogIn])) ->when($timelogOut, fn($collection) => $collection->merge([$timelogOut])); } public function getTimeAdjustments($date, $employee_id) { return EmployeeTimeAdjustment::select('employee_id', 'date', 'time', 'in_out') ->where('employee_id', $employee_id) ->where('date', $date) ->where('status', 2) ->where('validated', 1) ->get(); } private function getTimelogEdits($date, $employee_id) { return TimelogEdit::select('employee_id', 'date', 'time', 'in_out') ->where('employee_id', $employee_id) ->where('date', $date) ->where('approved', 1) ->get(); } // Helper to filter time adjustments by in/out type private function getTimeAdjustmentByType($timeAdjustments, int $type) { return $timeAdjustments->filter(fn($item) => $item->in_out === $type) ->map(fn($item) => $item->date . ' ' . $item->time) ->first(); } private function getTimelogEditByType($timelogEdit, string $type) { return $timelogEdit->filter(fn($item) => $item->in_out === $type) ->map(fn($item) => $item->date . ' ' . $item->time) ->first(); } // Helper to get adjusted time if available, else fallback to original private function getAdjustedTime($log, $time_in, $time_out) { return match ($log->in_out) { 'I' => $time_in ?? $log->datetimelog, 'O' => $time_out ?? $log->datetimelog, default => $log->datetimelog, }; } // Helper to get adjusted time if available, else fallback to original private function getAlteredTime($log, $time_in, $time_out) { return match ($log->in_out) { 'I' => $time_in ?? $log->datetimelog, 'O' => $time_out ?? $log->datetimelog, default => $log->datetimelog, }; } public function getOB($date, $employee_id) { return EmployeeOb::where('employee_id', '=', $employee_id) ->where('date_from', '<=', $date) ->where('date_to', '>=', $date) ->where('enabled', '=', 1) ->where('status', '=', 2) ->where('validated', 1) ->first(); } public function getOffsetAvailment($date, $employee_id) { return EmployeeOffset::where('employee_id', '=', $employee_id) ->where('date_from', '<=', $date) ->where('date_to', '>=', $date) ->where('enabled', '=', 1) ->where('status', '=', 2) ->where('validated', 1) ->first(); } public function getTardiness($timelogs, $schedule, $halfDayLeave=false, $ob, $offsetAvailment, $classification_id) { $payrollSetting = PayrollSetting::first(); if ($timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() && $schedule) { $firstTimelog = $timelogs->filter(fn($tl) => $tl->in_out=='I')->first(); $date = Carbon::parse($firstTimelog->datetimelog)->format('Y-m-d'); $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); $daysWFHArray = explode(',', $schedule->schedule->wfh); $daysCWSArray = explode(',', $schedule->schedule->cws_day); $schedule_in = ""; if(in_array($dayOfWeek,$daysCWSArray)) { $schedule_in = $schedule->schedule->cws_from_time; } elseif(!in_array($dayOfWeek, $daysArray)) { $schedule_in = $schedule->schedule->from_time; } if(($timelogs->filter(fn($tl) => $tl->in_out=='O')->isEmpty() && (!$ob && !$offsetAvailment)) && $schedule) { $schedule_out = ""; if(in_array($dayOfWeek,$daysCWSArray)) { $schedule_out = $schedule->schedule->cws_to_time; } elseif(!in_array($dayOfWeek, $daysArray)) { $schedule_out = $schedule->schedule->to_time; // $schedTimeIn = new DateTime($date . ' ' . $schedule_in); // $schedTimeOut = new DateTime($date . ' ' . $schedule_out); // // Calculate the difference between the two DateTime objects // $interval = $schedTimeOut->diff($schedTimeIn); // // Convert the interval to total minutes // $totalMinutes = ($interval->h * 60) + $interval->i; // // Use floor() if needed (though $totalMinutes is already an integer) // $totalMinutes = floor($totalMinutes) - 60; // // echo $employee_id; // // $minutes = ($interval->h * 60) + $interval->i; // return $totalMinutes; } // if($date == '2024-12-21'){ // dd($daysArray); // } } if ($ob && $ob->date_from == $date) { $obTimeStart = $date.' '.$ob->from_time; if (!$firstTimelog || new DateTime($obTimeStart) < new DateTime($firstTimelog->datetimelog)) { $firstTimelog->datetimelog = $obTimeStart; } } if ($offsetAvailment && $offsetAvailment->date_from == $date) { $offsetAvailmentTimeStart = $date.' '.$offsetAvailment->from_time; if (!$firstTimelog || new DateTime($offsetAvailmentTimeStart) < new DateTime($firstTimelog->datetimelog)) { $firstTimelog->datetimelog = $offsetAvailmentTimeStart; } } if ($firstTimelog && !empty($schedule_in)) { $firstTimelogTime = new DateTime($firstTimelog->datetimelog); $scheduledStartTime = new DateTime($date.' '.$schedule->schedule->from_time); $scheduledEndTime = new DateTime($date.' '.$schedule->schedule->to_time); $breakTimeStartTime = new DateTime($date.' 12:00:00'); $breakTimeEndTime = new DateTime($date.' 13:00:00'); $breakInterval = 0; if($firstTimelogTime>$breakTimeStartTime && $firstTimelogTime<$breakTimeEndTime) { $interval = $breakTimeStartTime->diff($scheduledStartTime); } else if($firstTimelog> $breakTimeEndTime) { $interval = $breakTimeStartTime->diff($scheduledStartTime); $interval2 = $firstTimelogTime->diff($breakTimeEndTime); $interval->h = $interval2->h; $interval->i = $interval2->i; } else { // Calculate the difference $interval = $firstTimelogTime->diff($scheduledStartTime); } /**If halfday leave */ if($halfDayLeave) { $workHours = $scheduledStartTime->diff($scheduledEndTime)->h - 1; if($interval->h >= $workHours/2) { /**if the interval exceeds half day, this means that the leave is at the start of schedule thus the timelog is after leave, then change the scheduledStartTime and recompute intervals */ $scheduledStartTime->add(new DateInterval('PT'.(($workHours/2)+1).'H')); $interval = $firstTimelogTime->diff($scheduledStartTime); } } /**THIS IS FOR TEST AND DEBUGGING ONLY */ // if($firstTimelog->employee_id == '2739' && Carbon::parse($firstTimelog->datetimelog)->format('Y-m-d')=='2024-12-23') { // // dd($firstTimelog); // dd(['timelogs' => $firstTimelog->datetimelog, 'schedule' => $scheduledStartTime, 'interval' => $interval]); // } // $scheduledStartTime->add(new DateInterval('PT'.$payrollSetting->late_grace_period.'M')); // Add 5 minutes grace period // $firstTimelogTimeFormatted = $firstTimelogTime->format('H:i:s'); // $scheduledStartTimeFormatted = $scheduledStartTime->format('H:i:s'); // if ($firstTimelogTime > $scheduledStartTime) { // $minutes = ($interval->h * 60) + $interval->i; // return floor($minutes); // } if($classification_id == '3') { $scheduledStartTime->add(new DateInterval('PT31M')); // Add 6 minutes grace period } else { $scheduledStartTime->add(new DateInterval('PT6M')); // Add 6 minutes grace period } $firstTimelogTimeFormatted = $firstTimelogTime->format('H:i:s'); $scheduledStartTimeFormatted = $scheduledStartTime->format('H:i:s'); if ($firstTimelogTime > $scheduledStartTime) { $minutes = ($interval->h * 60) + $interval->i; return floor($minutes); } } } return false; } public function getUndertime($timelogs, $schedule, $workSuspension, $formattedDate, $ob, $offsetAvailment, $wfhRecord, $halfDayLeave=false) { if ($timelogs && ($timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() || $ob || $offsetAvailment) && $schedule && !$workSuspension && !$halfDayLeave) { // dd($halfDayLeave); $lastTimelog = $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => $tl->datetimelog)->first(); $employee_id = $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => $tl->employee_id)->first(); if($ob && $ob->date_to == $formattedDate) { $obTimeEnd = $formattedDate.' '.$ob->to_time; if(!$lastTimelog || new DateTime($obTimeEnd) > new DateTime($lastTimelog)) { $lastTimelog = $obTimeEnd; } } if($offsetAvailment && $offsetAvailment->date_to == $formattedDate) { $offsetAvailmentTimeEnd = $formattedDate.' '.$offsetAvailment->to_time; if(!$lastTimelog || new DateTime($offsetAvailmentTimeEnd) > new DateTime($lastTimelog)) { $lastTimelog = $offsetAvailmentTimeEnd; } } $date = Carbon::parse($lastTimelog)->format('Y-m-d'); // if ($date == '2024-12-23' && $employee_id == '1922') { // dd($halfDayLeave); // } $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); $daysWFHArray = explode(',', $schedule->schedule->wfh); $daysCWSArray = explode(',', $schedule->schedule->cws_day); $schedule_out = ""; /**check if WFH and if has DAR */ $isWFH = in_array($dayOfWeek, $daysWFHArray); $validWFH = $wfhRecord && $wfhRecord->isNotEmpty(); if(in_array($dayOfWeek,$daysCWSArray)) { $schedule_in = $schedule->schedule->cws_from_time; $schedule_out = $schedule->schedule->cws_to_time; } elseif(!in_array($dayOfWeek, $daysArray)) { $schedule_in = $schedule->schedule->from_time; $schedule_out = $schedule->schedule->to_time; if(($timelogs->filter(fn($tl) => $tl->in_out=='I')->isEmpty() && !$ob && !$offsetAvailment) && $schedule && !$workSuspension) { $schedule_in = ""; if(in_array($dayOfWeek,$daysCWSArray)) { $schedule_in = $schedule->schedule->cws_from_time; } elseif(!in_array($dayOfWeek, $daysArray)) { $schedule_in = $schedule->schedule->from_time; } // $schedTimeIn = new DateTime($date . ' ' . $schedule_in); // $schedTimeOut = new DateTime($date . ' ' . $schedule_out); // // Calculate the difference between the two DateTime objects // $interval = $schedTimeOut->diff($schedTimeIn); // // Convert the interval to total minutes // $totalMinutes = ($interval->h * 60) + $interval->i; // // Use floor() if needed (though $totalMinutes is already an integer) // $totalMinutes = floor($totalMinutes) - 60; // dd($totalMinutes); // $minutes = ($interval->h * 60) + $interval->i; // return $totalMinutes; } } if ($lastTimelog && !empty($schedule_out)) { $lastTimelogTime = new DateTime($lastTimelog); $lastTimelogTime->setTime($lastTimelogTime->format('H'), $lastTimelogTime->format('i'), 0); $scheduledEndTime = new DateTime($date . ' ' . $schedule_out); $scheduledStartTime = new DateTime($date . ' ' . $schedule_in); $interval = $scheduledEndTime->diff($lastTimelogTime); $lastTimelogTimeFormatted = $lastTimelogTime->format('H:i:s'); $scheduledEndTimeFormatted = $scheduledEndTime->format('H:i:s'); // if($halfDayLeave) { // $workHours = $scheduledStartTime->diff($scheduledEndTime)->h - 1; // // dd($workHours); // if($interval->h >= $workHours/2) { /**if the interval exceeds half day, this means that the leave is at the start of schedule thus the timelog is after leave, then change the scheduledStartTime and recompute intervals */ // $scheduledEndTime->sub(new DateInterval('PT'.(($workHours/2)+1).'H')); // $interval = $scheduledEndTime->diff($lastTimelogTime); // $totalMinutes = ($interval->h * 60) + $interval->i + ($interval->s / 60); // // if($totalMinutes){ // // } // dd($interval); // } // /**THIS IS FOR TEST AND DEBUGGING ONLY */ // if($employee_id == '1922' && $date == '2024-12-23') { // // dd($firstTimelog); // dd(['timelogs' => $lastTimelog, 'schedule' => $scheduledEndTime, 'interval' => $interval]); // } // } if ($lastTimelogTime < $scheduledEndTime) { // Calculate the total difference in minutes, including seconds $totalMinutes = ($interval->h * 60) + $interval->i + ($interval->s / 60); // Round down to the nearest whole minute return floor($totalMinutes); } } } return false; } public function getOvertime($date, $employee_id) { return EmployeeOvertime::where('date_from', '<=', $date) ->where('date_to', '>=', $date) ->where('enabled', '=', 1) ->where('status', '=', 2) ->where('employee_id', '=', $employee_id) ->first(); } public function getAbsentTardinessHeadDashboard(Request $request) { $user = Auth::user(); $get_the_approver_hierarchy = Approver::where('approvers', 'like','%"'.$user->employee_id.'"%')->get(); $approver_hierarchy_result = []; foreach($get_the_approver_hierarchy as $data) { $approver_hierarchy_result['data'][$data->type][] = $data->type_id; } $members = []; $today = date('Y-m-d'); $processedEmployees = []; // Array to keep track of processed employees $wfhEmployees = []; // Array to keep track of processed employees foreach ($approver_hierarchy_result as $key => $data2) { // Loop through each organization type (dealership, division, group, etc.) foreach ($data2 as $key2 => $organization) { $key2 == 'dealership' ? $keys = 'dealer' : $keys = $key2; // Fetch employees based on the organization ID $employees = Employee::select('employee_id', DB::raw('CONCAT(firstname, " ", lastname) as fullname'), DB::raw('departments.name as department_name')) ->join('departments', 'employees.department_id', '=', 'departments.id') ->whereIn('employees.' . $keys . '_id', $organization) ->where('employees.employee_id', '!=', $user->employee_id) ->where('employees.enabled', '=', '1') ->whereNull('employees.date_resign') ->get(); foreach ($employees as $employee) { // Check if the employee has already been processed if (in_array($employee->employee_id, $processedEmployees)) { continue; // Skip if the employee has been processed } if(EmployeeWfh::whereDate('date', $today)->where('employee_id', $employee->employee_id)->exists()){ $wfhEmployees['employee']['employee_id'] = $employee->employee_id; $wfhEmployees['employee']['fullname'] = $employee->fullname; $wfhEmployees['employee']['department_name'] = $employee->department_name; } $processedEmployees[] = $employee->employee_id; // Mark the employee as processed $date = date('Y-m-d'); $timelogs = $this->getTimelog($date, $employee->employee_id); $schedule = $this->getSchedule($date, $employee->employee_id); $holiday = $this->getHoliday($date, $employee, $schedule); $leave = $this->getLeave($date, $employee->employee_id); $ob = $this->getLeave($date, $employee->employee_id); $offsetAvailment = $this->getOffsetAvailment($date, $employee->employee_id); $halfDayLeave = $leave && $leave->half_day == 1; $tardiness = $this->getTardiness($timelogs, $schedule, $halfDayLeave, $ob, $offsetAvailment, $employee->classification_id); // Check absence $isAbsent = $this->isAbsent($timelogs, $leave, $holiday, $schedule, $date); if ($tardiness) { $members['tardyMembers'][] = [ 'employee' => $employee, 'tardiness' => $tardiness, // for checking ]; } if ($isAbsent) { $members['absentMembers'][] = [ 'employee' => $employee, // 'absent' => $isAbsent // for checking ]; } } } // dd($wfhEmployees); } return response()->json([ 'members' => $members, 'wfhEmployees' => $wfhEmployees ]); } public function isAbsent($timelogs, $leave, $holiday, $schedule, $date) { // Check if there are no timelogs, no leave, no holiday, and it's not a day off if (!$timelogs->count() && !$leave && !$holiday) { if ($schedule) { // Proceed with accessing schedule->schedule $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); // Convert string to array } else { // Handle case where schedule is not found $dayOfWeek = date('l', strtotime($date)); $daysArray = []; // Or any default value } // dd($dayOfWeek); if (!in_array($dayOfWeek, $daysArray) && new DateTime($date) < new DateTime()) { return true; } } return false; } public function isPresent($timelogs, $leave, $holiday, $schedule, $date) { // Check if there are timelogs or it's a day off or holiday or leave if ($timelogs->count() > 0 || $leave || $holiday) { return true; } if ($schedule) { $dayOfWeek = date('l', strtotime($date)); $daysArray = explode(',', $schedule->schedule->day_off); // Convert string to array if (in_array($dayOfWeek, $daysArray)) { return true; // It's a day off } } return false; } public function addTITO(Request $request) { // dd($request->all()); DB::beginTransaction(); try { $request['datetimelog'] = date('Y-m-d H:i:s', strtotime($request->datetimelog)); $status = WfhFloatedTimelog::create($request->all()); DB::commit(); return response()->json([ 'status' => true, 'message' => 'Saved successfully!', 'data' => $status ], Response::HTTP_CREATED); } catch(Throwable $e) { DB::rollBack(); return response()->json([ 'status' => false, 'message' => 'Unable to process request. Please try again.', 'data' => $e->getMessage() ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function getProcessedAttendance(Request $request) { $getLastPayrollDate = ProcessedTimelog::where('employee_id', $request->employee_id)->orderBy('payroll_date', 'DESC')->first(); $timelogs = ProcessedTimelog::where('payroll_date', $getLastPayrollDate->payroll_date)->where('employee_id', $request->employee_id)->get(); $abensences = ProcessedAbsent::where('payroll_date', $getLastPayrollDate->payroll_date)->where('employee_id', $request->employee_id)->get(); $tardiness = ProcessedTardiness::where('payroll_date', $getLastPayrollDate->payroll_date)->where('employee_id', $request->employee_id)->get(); $result = []; foreach ($timelogs as $timelog) { // Check if the date already exists in the result array $date = $timelog['date']; if (isset($result[$date])) { // If the date exists and 'out' time is present, add it to the existing entry if ($timelog['in_out'] == 'O') { $result[$date]['name'] .= ' - ' . $timelog['time'] . ' OUT'; $result[$date]['has_out'] = true; // Mark that 'OUT' time exists } } else { // Create a new entry for 'in' or 'out' $result[$date] = [ 'date' => $timelog['date'], 'name' => $timelog['time'] . ($timelog['in_out'] == 'I' ? ' IN' : ' OUT'), 'title' => 'Present', 'has_in' => $timelog['in_out'] == 'I', // Mark if 'IN' exists 'has_out' => $timelog['in_out'] == 'O' // Mark if 'OUT' exists ]; } } // Post-processing to update title if 'IN' or 'OUT' is missing foreach ($result as &$entry) { if (empty($entry['has_in'])) { $entry['title'] = 'No Time In'; } elseif (empty($entry['has_out'])) { $entry['title'] = 'No Time Out'; } // Remove the markers as they are no longer needed unset($entry['has_in'], $entry['has_out']); } // To reset the array indices if needed $result = array_values($result); foreach($abensences as $absent){ $result[] = [ 'date' => $absent['date'], 'name' => $absent['no_of_days'] . ' Day/s', 'title' => 'Absent', ]; } foreach($tardiness as $tardy){ $result[] = [ 'date' => $tardy['date'], 'name' => $tardy['no_of_minutes']. ' Minutes', 'title' => 'Late', ]; } // Sort the result array by the 'date' key usort($result, function ($a, $b) { return strcmp($a['date'], $b['date']); }); return response()->json(array_values($result)); } // public function removeAttachment(Request $request, int $id) // { // $attachmentRequest = $ // } public function processAttendance(Request $request) { // dd($request->all());return; $employee_id =$request->employee_id; $company_id = $request->company_id; $dealer_id = $request->dealership_id; $department_id = $request->department_id; $payroll_date = $request->payroll_date; $start_date = new DateTime($request->start_date); $end_date = new DateTime($request->end_date); $end_date->modify('+1 day'); $payrollSetting = PayrollSetting::first(); // Create a DatePeriod object $period = new DatePeriod($start_date, new DateInterval('P1D'), $end_date); $presentDays = 0; $employee = Employee::where('employee_id', $employee_id)->first(); $isAlwaysPresent = $this->alwaysPresent($employee->employee_id); $data = [ 'timelog' => [], 'schedule' => [], 'holiday' => [], 'leave' => [], 'ob' => [], 'offsetAvailment' => [], 'undertime' => [], 'tardiness' => [], 'overtime' => [], 'night_differential' => [], 'absent' => [], 'dailyWorkHours' => [], 'days_present' => null, 'workDays' => null, 'isAlwaysPresent' => $isAlwaysPresent, ]; $where = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'payroll_date' => $payroll_date, ]; /**Delete temp record */ ProcessedLeave::where($where)->delete(); ProcessedTimelog::where($where)->delete(); ProcessedAbsent::where($where)->delete(); ProcessedUndertime::where($where)->delete(); ProcessedTardiness::where($where)->delete(); ProcessedOvertime::where($where)->delete(); ProcessedNightDifferential::where($where)->delete(); ProcessedDailyWorkHours::where($where)->delete(); ProcessedSchedule::where($where)->delete(); ProcessedOb::where($where)->delete(); ProcessedOffsetAvailment::where($where)->delete(); DB::beginTransaction(); try { foreach ($period as $date) { $formattedDate = $date->format('Y-m-d'); // Get Timelogs $schedule = $this->getSchedule($formattedDate, $employee_id); $timelogs = $this->getTimelog($formattedDate, $employee_id); $timelogData = []; if($timelogs) { $timelogData = $timelogs->map(fn($tl) => [ 'employee_id' => $employee_id, 'time_keeping_id' => $tl->time_keeping_id ?? null, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'time' => Carbon::parse($tl->datetimelog)->format('H:i:s'), 'in_out' => $tl->in_out, ] ); foreach($timelogData as $timelog) { $tlog = ProcessedTimelog::create($timelog); // dd($tlog); $data['timelog'][] = $tlog; } } // $this->addTimelogData($data, $timelogs, $formattedDate); // Get Holiday $holiday = $this->getHoliday($formattedDate, $employee, $schedule); $isHoliday = false; $isAbsentBeforeHoliday = false; if($holiday) { $isHoliday = true; // if($holiday->holiday_type=='3') { // $dealers = explode(',',$holiday->dealership_ids); // if(!in_array($dealer_id, $dealers)) { // $isHoliday = false; // } // } } if($holiday && $holiday['isAbsentBeforeHoliday'] == true){ $isAbsentBeforeHoliday = true; } // Get Schedule $schedule = $this->getSchedule($formattedDate, $employee_id); // echo'<pre>';print_r($schedule);echo'</pre>'; $workSuspension = $this->getWorkSuspension($formattedDate); $dayoff = EmployeeChangeSchedule::where('dayoff_date', $formattedDate)->where('validated', 1)->where('status', 2)->first(); $employee_change_schedule = EmployeeChangeSchedule::where(fn($q) => $q->whereNull('date_to') ->where('date', $formattedDate) ->orWhere(fn($q) => $q->whereNotNull('date_to') ->where('date', '<=', $formattedDate) ->where('date_to', '>=', $formattedDate) ) ->where('status', 2) ->where('validated', 1) )->where('status', 2) ->where('validated', 1) ->where('employee_id', $employee_id)->first(); // if($employee_id=='60638') { // dd($schedule->toArray()); // } $scheduleData = []; $schedule_in = ""; $schedule_out = ""; $isRestDay = false; if(!$isAlwaysPresent) { if(!empty($dayoff)){ $isRestDay = true; $scheduleData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $schedule_in, 'schedule_out' => $schedule_out, 'cws' => 0, 'wfh' => 0, 'restday' => $isRestDay, 'duty_hours' => 0, 'holiday' => $isHoliday ? $holiday->name : null, 'holiday_type' => $isHoliday ? $holiday->holiday_type: null, ]; $data['schedule'][] = $scheduleData; } else if(!empty($employee_change_schedule)){ $startTime = Carbon::parse($formattedDate.' '.$employee_change_schedule->from_time); $endTime = Carbon::parse($formattedDate.' '.$employee_change_schedule->to_time); // Compute the difference in hours $hoursDifference = (int)$startTime->diffInHours($endTime); if($hoursDifference > 0) { $hoursDifference--; } $scheduleData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $employee_change_schedule->from_time, 'schedule_out' => $employee_change_schedule->to_time, 'cws' => 0, 'wfh' => 0, 'restday' => $isRestDay, 'duty_hours' => $hoursDifference, 'holiday' => $isHoliday ? $holiday->name : null, 'holiday_type' => $isHoliday ? $holiday->holiday_type: null, ]; $data['schedule'][] = $scheduleData; } elseif($schedule) { // if($schedule && $schedule->schedule == null) { // dd($schedule->toArray()); // } $dayOfWeek = date('l', strtotime($formattedDate)); $daysArray = explode(',', $schedule->schedule->day_off); $daysWFHArray = explode(',', $schedule->schedule->wfh); $daysCWSArray = explode(',', $schedule->schedule->cws_day); if(in_array($dayOfWeek,$daysCWSArray)) { $schedule_in = $schedule->schedule->cws_from_time; $schedule_out = $schedule->schedule->cws_to_time; } elseif(!in_array($dayOfWeek, $daysArray)) { $schedule_in = $schedule->schedule->from_time; $schedule_out = $schedule->schedule->to_time; } $isRestDay = in_array($dayOfWeek, $daysArray); $startTime = Carbon::parse($formattedDate.' '.$schedule_in); $endTime = Carbon::parse($formattedDate.' '.$schedule_out); // dd($formattedDate.' '.$schedule->schedule->from_time. ' | '.$formattedDate.' '.$schedule->schedule->to_time); // Compute the difference in hours $hoursDifference = (int)$startTime->diffInHours($endTime); if($hoursDifference > 0) { $hoursDifference--; } $scheduleData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $schedule_in, 'schedule_out' => $schedule_out, 'cws' => in_array($dayOfWeek, $daysCWSArray), 'wfh' => in_array($dayOfWeek, $daysWFHArray), 'restday' => $isRestDay, 'duty_hours' => $hoursDifference, 'holiday' => $isHoliday ? $holiday->name : null, 'holiday_type' => $isHoliday ? $holiday->holiday_type: null, ]; $data['schedule'][] = $scheduleData; ProcessedSchedule::create($scheduleData); } // if($employee_id == '1424') { // dd($scheduleData); // } } //GET WFH $wfhRecord = EmployeeWfh::whereNotNull('attachment')->where(['employee_id'=> $employee_id, 'date'=>$formattedDate, 'status'=>2, 'validated'=>1])->first(); // Get Leave $leaveHours = 0; $leave = $this->getLeave($formattedDate, $employee_id); if($leave) { $leaveHours = $leave->hours; $leaveData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'no_of_hours' => $leave->hours, 'type' => $leave->leave_id, 'without_pay' => $leave->without_pay, ]; ProcessedLeave::create($leaveData); $data['leave'][] = $leaveData; } // $this->addLeaveData($data, $leave, $formattedDate); $ob = $this->getOB($formattedDate, $employee_id); if($ob) { $obData = [ 'ob_id' => $ob->id, 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'from_time' => $ob->from_time, 'to_time' => $ob->to_time, 'meal' => $ob->meal, 'transportation' => $ob->transportation, 'meal_amount' => $ob->meal_amount, 'transportation_amount' => $ob->transportation_amount, 'description' => $ob->description, 'destination' => $ob->destination, ]; $data['ob'][] = $obData; ProcessedOb::create($obData); } $offsetAvailment = $this->getOffsetAvailment($formattedDate, $employee_id); if($offsetAvailment) { $offsetAvailmentData = [ 'offset_availment_id' => $offsetAvailment->id, 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'from_time' => $offsetAvailment->from_time, 'to_time' => $offsetAvailment->to_time, 'description' => $offsetAvailment->description, ]; $data['offsetAvailment'][] = $offsetAvailmentData; ProcessedOffsetAvailment::create($offsetAvailmentData); } // Check Tardiness $halfDayLeave = $leave && $leave->half_day == 1; $tardiness = $this->getTardiness($timelogs, $schedule, $halfDayLeave, $ob, $offsetAvailment, $employee->classification_id); if($tardiness && $tardiness < 60) { $tardinessData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : '', 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : '', 'no_of_minutes' => $tardiness, ]; $data['tardiness'][] = $tardinessData; ProcessedTardiness::create($tardinessData); } // $this->addTardinessData($data, $tardiness, $formattedDate); // Get Undertime $undertime = $this->getUndertime($timelogs, $schedule, $workSuspension, $formattedDate, $ob, $offsetAvailment, $wfhRecord, $halfDayLeave); $undertime_minutes = 0; if($tardiness && $tardiness >= $payrollSetting->undertime_minute_from) { $undertime_minutes = $tardiness; } if($undertime) $undertime_minutes += $undertime; if($undertime_minutes > 0) { $undertimeData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'no_of_minutes' => $undertime_minutes, ]; ProcessedUndertime::create($undertimeData); $data['undertime'][] = $undertimeData; } // if ($formattedDate == '2024-12-23' && $employee_id == '1922') { // dd($data['undertime']); // } // Get Overtime and holiday pay $time_in = $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('Y-m-d H:i:s'))->first() : null; $time_out = $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('Y-m-d H:i:s'))->first() : null; $hoursWorked = 0; $regularHoursWorked = 0; $hoursOT = 0; $holidayRestdayHours = 0; if($time_in && $time_out) { $timeIn = Carbon::parse($time_in); $timeOut = Carbon::parse($time_out); $schedIn = !$isRestDay ? Carbon::parse($formattedDate.' '.$schedule_in) : null; $schedOut = !$isRestDay ? Carbon::parse($formattedDate.' '.$schedule_out) : null; // Set the start of work to the scheduled time-in if time-in is earlier than schedule if ($schedIn && $timeIn->lt($schedIn)) { $timeIn = $schedIn; } // Calculate hours worked between adjusted time-in and time-out $hoursWorked = (int)$timeIn->diffInHours($timeOut); if($hoursWorked>8) { $hoursWorked--; } if($schedOut) { /**get regular hours worked */ if($timeOut->lt($schedOut)) { $regularHoursWorked = (int)$timeIn->diffInHours($timeOut); $holidayRestdayHours = (int)$timeIn->diffInHours($timeOut); } else { $regularHoursWorked = (int)$timeIn->diffInHours($schedOut); $holidayRestdayHours = (int)$timeIn->diffInHours($schedOut); } if($holidayRestdayHours > 8) { $holidayRestdayHours--; } // Check if time-out is beyond the scheduled time-out for overtime calculation if ($timeOut->gt($schedOut)) { $interval = $schedOut->diff($timeOut); $minutes = (int) ltrim($interval->format('%i'), '0'); if($minutes >= $payrollSetting->overtime_minute_from) { /**if OT hours is equal or exceeds the minimum OT hours */ $hoursOT = (int)$schedOut->diffInHours($timeOut); } } if($regularHoursWorked > 8) { $regularHoursWorked--; } } else { $holidayRestdayHours = (int)$timeIn->diffInHours($timeOut); if($holidayRestdayHours > 8) { if($holidayRestdayHours > 9) { $hoursOT = $holidayRestdayHours - 9; } $holidayRestdayHours = 8; } } /**IF OT hours exceeds the MAX OT based on payroll settings */ if($hoursOT > 0 && $hoursOT > ceil($payrollSetting->overtime_minute_to/60)) { $hourOT = ceil($payrollSetting->overtime_minute_to/60); } } $holidayData = []; if($isHoliday && $timelogs->isNotEmpty() && $holidayRestdayHours > 0) { $regularhoursWorked = 0; /**reset regular hours, set holiday hours instead */ DB::enableQueryLog(); $holidaySetting = PremiumOvertimePaySetting::where([ 'isRestday' => $scheduleData['restday'] ?? 0, 'holiday_type_id' => $holiday->holiday_type ?? null, 'isOvertime' => 0 ])->first(); // if($employee_id == 60653 && !$holidaySetting) // { // dd(DB::getQueryLog()); // } $holidayData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'payment_setting_id' => $holidaySetting->id, 'payment_setting_name' => $holidaySetting->name, 'holiday_name' => $holiday->name, 'holiday_type' => $holiday->holiday_type, 'percentage' => $holidaySetting->percentage, 'no_of_hours' => $holidayRestdayHours, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, ]; $data['holiday'][] = $holidayData; ProcessedHolidayRestdayDuty::create($holidayData); } $overtime = $this->getOvertime($formattedDate, $employee_id); $overtimeData = []; if($overtime && $timelogs->isNotEmpty() && $overtime->charge_to == $company_id && !empty($scheduleData)) { // if($employee_id==60653 && $formattedDate=='2024-09-10') { // dd($overtime); // } DB::enableQueryLog(); $overtimeSetting = PremiumOvertimePaySetting::where([ 'isRestday' => $scheduleData['restday'] ?? 0, 'holiday_type_id' => $holidayData['type'] ?? null, 'isOvertime' => true ])->first(); // if($employee_id == '60623') { dd(DB::getQueryLog()); } // dd($formattedDate.' '.$schedule->schedule->from_time. ' | '.$formattedDate.' '.$schedule->schedule->to_time); // Compute the difference in hours /**IF RESTDAY DUTY */ if(isset($scheduleData['restday']) && $scheduleData['restday']==1) { $regularhoursWorked = 0; /**reset regular hours, set restday duty hours instead */ $holidaySetting = PremiumOvertimePaySetting::where([ 'isRestday' => 1, 'holiday_type_id' => $holiday->holiday_type ?? null, 'isOvertime' => 0 ])->first(); $holidayData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'no_of_hours' => $overtime->hours < $holidayRestdayHours ? $overtime->hours : $holidayRestdayHours, 'payment_setting_id' => $holidaySetting->id, 'payment_setting_name' => $holidaySetting->name, 'holiday_name' => $holiday->name ?? null, 'holiday_type' => $holiday->holiday_type ?? null, 'percentage' => $holidaySetting->percentage, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, ]; $data['holiday'][] = $holidayData; // if($employee_id=='2245' && $formattedDate=='2024-12-29') dd($data['holiday']); ProcessedHolidayRestdayDuty::create($holidayData); } if($hoursOT > 0) { $overtimeData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'no_of_hours' => $overtime->hours < $hoursOT ? $overtime->hours : $hoursOT, 'payment_setting_id' => $overtimeSetting->id, 'payment_setting_name' => $overtimeSetting->name, 'percentage' => $overtimeSetting->percentage, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'meal' => $overtime->meal, 'transportation' => $overtime->transportation, 'meal_amount' => $overtime->meal_amount, 'transportation_amount' => $overtime->transportation_amount, ]; $data['overtime'][] = $overtimeData; ProcessedOvertime::create($overtimeData); } } // $this->addOvertimeData($data, $overtime, $formattedDate); /**Night Differential */ if($time_out) { $nightDifferentialTime = Carbon::parse($formattedDate. $payrollSetting->night_differential_from); $timeOutTime = Carbon::parse($time_out); $night_diff_hours = 0; if($nightDifferentialTime->lt($timeOutTime)) { $night_diff_hours = (int)$nightDifferentialTime->diffInHours($timeOutTime); } if($night_diff_hours > 0) { $nightDiffData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'no_of_hours' => $night_diff_hours, 'payment_setting_id' => $holidayData['payment_setting_id'] ?? 0, 'payment_setting_name' => $holidayData['payment_setting_name'] ?? null, 'percentage' => ($holidayData['percentage'] ?? 100) * ($payrollSetting->night_differential_rate/100), 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, ]; $data['night_differential'][] = $nightDiffData; ProcessedNightDifferential::create($nightDiffData); } } // Check Tardiness $halfDayLeave = $leave && $leave->half_day == 1; if(!$isAlwaysPresent){ $tardiness = $this->getTardiness($timelogs, $schedule, $halfDayLeave, $ob, $offsetAvailment, $employee->classification_id); if($tardiness && $tardiness < 60) { $tardinessData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : '', 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : '', 'no_of_minutes' => $tardiness, ]; $data['tardiness'][] = $tardinessData; ProcessedTardiness::create($tardinessData); } // $this->addTardinessData($data, $tardiness, $formattedDate); // Get Undertime $undertime = $this->getUndertime($timelogs, $schedule, $workSuspension, $formattedDate, $ob, $offsetAvailment, $wfhRecord, $halfDayLeave); $undertime_minutes = 0; if($tardiness && $tardiness >= $payrollSetting->undertime_minute_from) { $undertime_minutes = $tardiness; } if($undertime) $undertime_minutes += $undertime; if($undertime_minutes > 0) { $undertimeData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'schedule_in' => $scheduleData['schedule_in'] ?? null, 'schedule_out' => $scheduleData['schedule_out'] ?? null, 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='O')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='O')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'no_of_minutes' => $undertime_minutes, ]; ProcessedUndertime::create($undertimeData); $data['undertime'][] = $undertimeData; } // Check for Absenfce // if($employee_id==60653) { // dd(['date'=>$formattedDate, 'timelogsCount' => !$timelogs->count(), '!leave' => !$leave, '!holiday'=>!$holiday, 'schedule'=>$schedule]); // } if (!$timelogs->count() && !$leave && (!$isHoliday || $isAbsentBeforeHoliday) && $schedule && !$ob && !$offsetAvailment) { $dayOfWeek = date('l', strtotime($formattedDate)); $daysArray = explode(',', $schedule->schedule->day_off); // Convert string to array $daysWFHArray = explode(',', $schedule->schedule->wfh); /**check WFH if has DAR */ $isWFH = in_array($dayOfWeek, $daysWFHArray); $validWFH = $wfhRecord && $wfhRecord->isNotEmpty(); if (!in_array($dayOfWeek, $daysArray) && (!$isWFH || !$validWFH) && new DateTime($formattedDate) < new DateTime()) { $days_absent = 1; if($scheduleData['cws']==true) { $days_absent = $scheduleData['duty_hours'] / 8; } $absentData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'no_of_days' => $days_absent, 'schedule_in' => $scheduleData['schedule_in'], 'schedule_out' => $scheduleData['schedule_out'], 'time_in' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='I')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='I')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, 'time_out' => $timelogs && $timelogs->filter(fn($tl) => $tl->in_out=='0')->isNotEmpty() ? $timelogs->filter(fn($tl) => $tl->in_out=='0')->map(fn($tl) => Carbon::parse($tl->datetimelog)->format('H:i:s'))->first() : null, ]; ProcessedAbsent::create($absentData); $data['absent'][] = $absentData; } } } if($timelogs->isNotEmpty() && $schedule) { $dailyWorkHoursData = [ 'employee_id' => $employee_id, 'company_id' => $company_id, 'dealership_id' => $dealer_id, 'department_id' => $department_id, 'payroll_date' => $payroll_date, 'date' => $formattedDate, 'work_hours' => $regularHoursWorked, 'holiday_restday_hours' => $holidayRestdayHours, 'ot_hours' => $hoursOT, 'leave_hours' => $leaveHours, ]; $data['dailyWorkHours'][] = $dailyWorkHoursData; ProcessedDailyWorkHours::create($dailyWorkHoursData); } // $this->addAbsenceData($data, $timelogs, $leave, $holiday, $schedule, $formattedDate); // Check if present if ($this->isPresent($timelogs, $leave, $holiday, $schedule, $formattedDate)) { $presentDays++; $data['days_present'][] = $formattedDate; } /**Update the requests as processed */ EmployeeLeave::where('employee_id', $employee_id)->where('status', 2)->where('date_from','<=',$formattedDate)->where('date_to', '>=', $formattedDate)->update(['processed' => 1]); EmployeeOvertime::where('employee_id', $employee_id)->where('status', 2)->where('date_from','<=',$formattedDate)->where('date_to', '>=', $formattedDate)->update(['processed' => 1]); EmployeeOb::where('employee_id', $employee_id)->where('status', 2)->where('date_from','<=',$formattedDate)->where('date_to', '>=', $formattedDate)->update(['processed' => 1]); EmployeeOffset::where('employee_id', $employee_id)->where('status', 2)->where('date_from','<=',$formattedDate)->where('date_to', '>=', $formattedDate)->update(['processed' => 1]); EmployeeTimeAdjustment::where('employee_id', $employee_id)->where('status', 2)->where('date', $formattedDate)->update(['processed' => 1]); EmployeeChangeSchedule::where('employee_id', $employee_id)->where('status', 2)->where('validated', 1)->where('date', $formattedDate)->update(['processed' => 1]); // EmployeeOffset::where('employee_id', $employee_id)->where('status', 2)->where('date_from','<=',$formattedDate)->where('date_to', '>=', $formattedDate)->update(['processed' => 1]); } $data['workDays'] = $presentDays; // dd($presentDays); DB::commit(); return response()->json($data); } catch (Throwable $e) { DB::rollback(); return response()->json([ 'status' => false, 'message' => $e->getMessage() // 'message' => 'Unable to process request. Please try again.', // 'data' => $e->getMessage() ], 422); } } }
| ver. 1.4 |
.
| PHP 8.1.32 | Generation time: 0.07 |
proxy
|
phpinfo
|
Settings